# General imports
import numpy as np
from nupack import *
import random
import time
from parse_results import *
| Tube | On-Targets $(\Psi_{h}^{on})$ | Off-Targets $(\Psi_{h}^{off})$ |
|---|---|---|
| Step 0 | {X,A,B,C,D} | $\Psi_{0}^{L\leq L_{max}}$ - {X$\cdot$A, X$\cdot$B} |
| Step 1 | {X$\cdot$A} | {X,A} $\cup \Psi_{1}^{L\leq L_{max}}$ |
| Step 2 | {X$\cdot$A$\cdot$B} | {X$\cdot$A, B} $\cup \Psi_{2}^{L\leq L_{max}}$ |
| Step 3 | {X$\cdot$A$\cdot$B$\cdot$C} | {X$\cdot$A$\cdot$B, C} $\cup \Psi_{3}^{L\leq L_{max}}$ |
| Step 4a | {X$\cdot$A$\cdot$B$\cdot$C$\cdot$D} | {X$\cdot$A$\cdot$B$\cdot$C, D} $\cup \Psi_{4a}^{L\leq L_{max}}$ |
| Step 4b | {X, A$\cdot$B$\cdot$C$\cdot$D} | {A$\cdot$B$\cdot$C$\cdot$D, X} $\cup \Psi_{4b}^{L\leq L_{max}}$ |
| Crosstalk | $\cup_{n=1}${$\lambda^{reactive}$} | $\Psi_{global}^{L\leq L_{max}}$ - $\cup_{n=1}${$\lambda^{cognate}$} |
Crosstalk tube: $ \Psi_{global}^{reactive} \equiv \cup_{n=1}${$\lambda^{reactive}$}; $\Psi_{global}^{reactive} \equiv \Psi_{global}^{L\leq L_{max}}$ - $\cup_{n=1}${$\lambda^{cognate}$}
The reactive species and cognate productts for system n are:
$\lambda^{cognate} \equiv $ {$X \cdot A, X \cdot B, X \cdot D, A \cdot C^{out}, A \cdot D^{out}, A^{out}\cdot B, A^{out}\cdot C, B \cdot D^{out}, B^{out}\cdot C, B^{out}\cdot D, B^{out}\cdot A, C^{out}\cdot D $}
based on the definitions (listed 5' to 3' using seequeence domain notion of above figure)
$ A \equiv A^{in} - A^{out} $
$ A^{toe} \equiv a $
$ A^{in} \equiv a-x-b-y $
$ A^{out} \equiv z*-c*-y*-b*-c* $
$ B \equiv B^{in} - B^{out} $
$ B^{toe} \equiv b $
$ B^{in} \equiv b-y-c-z $
$ B^{out} \equiv w*-d*-z*-c*-y* $
$ C \equiv C^{in} - C^{out} $
$ C^{toe} \equiv c $
$ C^{in} \equiv c-z-d-w $
$ C^{out} \equiv x*-a*-w*-d*-z* $
$ D \equiv D^{in} - D^{out} $
$ D^{toe} \equiv d $
$ D^{in} \equiv d-w-a-x $
$ D^{out} \equiv y*-b*-x*-a*-w* $
$ X \equiv y*-b*-x*-a* $
%%time
# define model
my_model = Model(material='dna', celsius=23)
# initialize empty lists
crosstalk_targets = {}
crosstalk_excludes = []
step_tubes = []
# define sequence domains
a = Domain('N12', name=['a'])
b = Domain('N12', name=['b'])
c = Domain('N12', name=['c'])
d = Domain('N12', name=['d'])
w = Domain('N6', name=['w'])
x = Domain('N6', name=['x'])
y = Domain('N6', name=['y'])
z = Domain('N6', name=['z'])
# define strands
sA_out = TargetStrand([~z, ~c, ~y, ~b, ~x], name=['sA_out'])
sB_out = TargetStrand([~w, ~d, ~z, ~c, ~y], name=['sB_out'])
sC_out = TargetStrand([~x, ~a, ~w, ~d, ~z], name=['sC_out'])
sD_out = TargetStrand([~y, ~b, ~x, ~a, ~w], name=['sD_out'])
sA = TargetStrand([a, x, b, y, ~z, ~c, ~y, ~b, ~x], name=['sA'])
sB = TargetStrand([b, y, c, z, ~w, ~d, ~z, ~c, ~y], name=['sB'])
sC = TargetStrand([c, z, d, w, ~x, ~a, ~w, ~d, ~z], name=['sC'])
sD = TargetStrand([d, w, a, x, ~y, ~b, ~x, ~a, ~w], name=['sD'])
sX = TargetStrand([~y, ~b, ~x, ~a], name=['sX'])
# define target complexes
A_out = TargetComplex([sA_out], 'U42', name='A_out')
B_out = TargetComplex([sB_out], 'U42', name='B_out')
C_out = TargetComplex([sC_out], 'U42', name='C_out')
D_out = TargetComplex([sD_out], 'U42', name='D_out')
A = TargetComplex([sA], 'U12 D24 U18', name='A')
B = TargetComplex([sB], 'U12 D24 U18', name='B')
C = TargetComplex([sC], 'U12 D24 U18', name='C')
D = TargetComplex([sD], 'U12 D24 U18', name='D')
X = TargetComplex([sX], 'U36', name='X')
XA = TargetComplex([sX,sA], 'D36 + U42', name='XA')
XAB = TargetComplex([sA,sB,sX], 'D36(D36(U6+)U42+)', name='XAB')
XABC = TargetComplex([sA,sB,sC,sX], 'D36(D36(U6+)D36(U6+)U42+)', name='XABC')
XABCD = TargetComplex([sA,sB,sC,sD,sX], 'D36(D36(U6+)D36(U6+)D36(U6+)U42+)', name='XABCD')
ABCD = TargetComplex([sA,sB,sC,sD], 'D36(D36(U6+)D36(U6+)D36(U6+))U6', name='ABCD')
# define 6 elementary tubes
Step_0 = TargetTube({A: 1e-08, B: 1e-08, C: 1e-08, D: 1e-08, X: 1e-08},
off_targets=SetSpec(max_size=2, exclude=[XA, [sX, sB]]), name=['Step_0']) # include=[[sA, sB, sC, sD, sX]],
Step_1 = TargetTube({XA: 1e-08},
off_targets=SetSpec(max_size=2, include=[X, A]), name=['Step_1'])
Step_2 = TargetTube({XAB: 1e-08},
off_targets=SetSpec(max_size=2, include=[XA, B]), name=['Step_2'])
Step_3 = TargetTube({XABC: 1e-08},
off_targets=SetSpec(max_size=2, include=[XAB, C]), name=['Step_3'])
Step_4a = TargetTube({XABCD: 1e-08},
off_targets=SetSpec(max_size=2, include=[XABC, D]), name=['Step_4a'])
Step_4b = TargetTube({ABCD: 1e-08},
off_targets=SetSpec(max_size=2, include=[XABCD]), name=['Step_4b']) #X: 1e-08,
# Store contributions to global crosstalk tube
Crosstalk = TargetTube(on_targets = {
A_out: 1e-08,
B_out: 1e-08,
C_out: 1e-08,
D_out: 1e-08,
A: 1e-08,
B: 1e-08,
C: 1e-08,
D: 1e-08,
X: 1e-08},
off_targets=SetSpec(max_size=2, exclude=[XA, [sX, sB], [sA_out, sB], [sA_out, sC], [sB_out, sC], [sB_out, sD],[sC_out, sA], [sC_out, sD], [sD_out, sA], [sX, sD], [sB_out, sA], [sB, sD_out]]),
name = 'Crosstalk')
# Define tube set
my_tubes = step_tubes + [Crosstalk]
# stop condition of 4%
my_options = DesignOptions(f_stop=0.04)
# Define and run the test tube design job
my_design = tube_design(tubes=[Step_0, Step_1, Step_2, Step_3, Step_4a, Step_4b, Crosstalk], model=my_model, options=my_options)
my_results = my_design.run(trials=1)
# Display the design results
my_results[0]
CPU times: user 19.8 s, sys: 3.22 s, total: 23 s Wall time: 17.8 s
| Domain | Sequence |
|---|---|
| a | TTTGGGGTGTTG |
| a* | CAACACCCCAAA |
| b | GAGCGAGGAAGA |
| b* | TCTTCCTCGCTC |
| c | AATGGAGTGGTA |
| c* | TACCACTCCATT |
| d | GTAGAGTTGAAG |
| d* | CTTCAACTCTAC |
| w | GAGGGG |
| w* | CCCCTC |
| x | GGAGGT |
| x* | ACCTCC |
| y | GGGATG |
| y* | CATCCC |
| z | GGAATA |
| z* | TATTCC |
| Strand | Sequence |
|---|---|
| sA | TTTGGGGTGTTGGGAGGTGAGCGAGGAAGAGGGATGTATTCCTACCACTCCATTCATCCCTCTTCCTCGCTCACCTCC |
| sC_out | ACCTCCCAACACCCCAAACCCCTCCTTCAACTCTACTATTCC |
| sC | AATGGAGTGGTAGGAATAGTAGAGTTGAAGGAGGGGACCTCCCAACACCCCAAACCCCTCCTTCAACTCTACTATTCC |
| sA_out | TATTCCTACCACTCCATTCATCCCTCTTCCTCGCTCACCTCC |
| sB | GAGCGAGGAAGAGGGATGAATGGAGTGGTAGGAATACCCCTCCTTCAACTCTACTATTCCTACCACTCCATTCATCCC |
| sD | GTAGAGTTGAAGGAGGGGTTTGGGGTGTTGGGAGGTCATCCCTCTTCCTCGCTCACCTCCCAACACCCCAAACCCCTC |
| sX | CATCCCTCTTCCTCGCTCACCTCCCAACACCCCAAA |
| sD_out | CATCCCTCTTCCTCGCTCACCTCCCAACACCCCAAACCCCTC |
| sB_out | CCCCTCCTTCAACTCTACTATTCCTACCACTCCATTCATCCC |
| Objective type | Value |
|---|---|
| Weighted ensemble defect | 0.0322 |
| Complex | Complex defect (nt) | Normalized complex defect |
|---|---|---|
| XAB | 3.64 | 0.0190 |
| C | 0.715 | 0.00916 |
| C_out | 1.82 | 0.0433 |
| XABCD | 18.1 | 0.0520 |
| D | 1.30 | 0.0166 |
| B_out | 2.01 | 0.0479 |
| D_out | 1.51 | 0.0359 |
| X | 1.34 | 0.0371 |
| B | 1.60 | 0.0205 |
| A_out | 2.20 | 0.0524 |
| ABCD | 2.43 | 0.00780 |
| XABC | 5.97 | 0.0221 |
| XA | 6.21 | 0.0544 |
| A | 2.30 | 0.0295 |
| Tube | Tube defect (M) | Normalized tube defect |
|---|---|---|
| Step_0 | 8.74e-08 | 0.0251 |
| Step_1 | 6.21e-08 | 0.0545 |
| Step_2 | 3.65e-08 | 0.0190 |
| Step_3 | 6.00e-08 | 0.0222 |
| Step_4a | 1.81e-07 | 0.0521 |
| Step_4b | 2.43e-08 | 0.00780 |
| Crosstalk | 2.33e-07 | 0.0451 |
| Tube | On-target complex | Structural defect (M) | Concentration defect (M) | Total defect (M) |
|---|---|---|---|---|
| Step_0 | A | 2.30e-08 | 3.08e-12 | 2.30e-08 |
| Step_0 | B | 1.60e-08 | 2.49e-11 | 1.60e-08 |
| Step_0 | C | 7.10e-09 | 4.58e-09 | 1.17e-08 |
| Step_0 | D | 1.29e-08 | 5.83e-09 | 1.87e-08 |
| Step_0 | X | 1.32e-08 | 4.80e-09 | 1.80e-08 |
| Step_1 | XA | 6.21e-08 | 2.17e-11 | 6.21e-08 |
| Step_2 | XAB | 3.64e-08 | 7.18e-12 | 3.65e-08 |
| Step_3 | XABC | 5.97e-08 | 3.11e-10 | 6.00e-08 |
| Step_4a | XABCD | 1.81e-07 | 8.20e-11 | 1.81e-07 |
| Step_4b | ABCD | 2.43e-08 | 1.13e-17 | 2.43e-08 |
| Crosstalk | A_out | 2.16e-08 | 7.06e-09 | 2.87e-08 |
| Crosstalk | B_out | 2.00e-08 | 3.46e-09 | 2.34e-08 |
| Crosstalk | C_out | 1.77e-08 | 1.19e-08 | 2.96e-08 |
| Crosstalk | D_out | 1.49e-08 | 5.68e-09 | 2.06e-08 |
| Crosstalk | A | 2.29e-08 | 3.99e-09 | 2.69e-08 |
| Crosstalk | B | 1.58e-08 | 1.01e-08 | 2.59e-08 |
| Crosstalk | C | 6.89e-09 | 2.77e-08 | 3.46e-08 |
| Crosstalk | D | 1.27e-08 | 1.49e-08 | 2.76e-08 |
| Crosstalk | X | 1.33e-08 | 2.07e-09 | 1.54e-08 |
| Tube | Complex | Concentration (M) | Target concentration (M) |
|---|---|---|---|
| Step_0 | A | 1.00e-08 | 1.00e-08 |
| Step_0 | B | 1.00e-08 | 1.00e-08 |
| Step_0 | C | 9.94e-09 | 1.00e-08 |
| Step_0 | D | 9.93e-09 | 1.00e-08 |
| Step_0 | X | 9.87e-09 | 1.00e-08 |
| Step_1 | XA | 1.00e-08 | 1.00e-08 |
| Step_2 | XAB | 1.00e-08 | 1.00e-08 |
| Step_3 | XABC | 1.00e-08 | 1.00e-08 |
| Step_4a | XABCD | 1.00e-08 | 1.00e-08 |
| Step_4b | ABCD | 1.00e-08 | 1.00e-08 |
| Crosstalk | A_out | 9.83e-09 | 1.00e-08 |
| Crosstalk | B_out | 9.92e-09 | 1.00e-08 |
| Crosstalk | C_out | 9.72e-09 | 1.00e-08 |
| Crosstalk | D_out | 9.86e-09 | 1.00e-08 |
| Crosstalk | A | 9.95e-09 | 1.00e-08 |
| Crosstalk | B | 9.87e-09 | 1.00e-08 |
| Crosstalk | C | 9.65e-09 | 1.00e-08 |
| Crosstalk | D | 9.81e-09 | 1.00e-08 |
| Crosstalk | X | 9.94e-09 | 1.00e-08 |
| Tube | Complex | Concentration (M) |
|---|---|---|
| Crosstalk | (sA_out+sD) | 1.17e-10 |
| Crosstalk | (sC_out+sC) | 2.37e-10 |
| Step_2 | — | |
| Step_4a | — | |
| Step_4b | — | |
| Step_1 | — | |
| Step_0 | — | |
| Step_3 | — |
import holoviews as hv
hv.notebook_extension('bokeh')
results_df = parse_results(my_results)
generate_bars(results_df)
/home/nupack/persist/parse_results.py:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy normalize_df['normalization factor'] = normalize_df['concentration'] * normalize_df['nucleotides']
generate_crosstalk_bars(results_df)
The majority of the residual defect results from structural not concentration defects. However, in the crosstalk tube, the high concentration defect of strands C and D increase the ration of concentration defect to structural defect.